/**
 * 队列
 * 队列区别于栈 遵循的是先进先出的原则
 * 新进入的元素永远在队尾
 */
interface QueueItems<T> extends Object{
    [index:number]: T;
}

class Queue<T = any> {
    current: number; // 保存队列大小
    items: QueueItems<T>; // 保存队列元素
    lastCurrent: number; // 追踪第一个元素

    /**
     * 构造函数
     * @param args 初始值
     */
    constructor(...args:T[]) {
        this.current = 0;
        this.items = {};
        this.lastCurrent = 0;
        if(args.length){
            this.enqueue(...args);
        }
    }

    /**
     * 添加元素
     * @param args:<T> 所有的参数
     */
    enqueue(...args:T[]):void{
        for (let i = 0,len = args.length; i < len; i++) {
            this.items[this.current] = args[i];
            this.current++;
        }
    }

    /**
     * 移除队列中第一个的元素, 并且返回被移除的元素
     * @return <T> | undefined 返回被移除的元素, 如果没有则返回undefined
     */
    dequeue():T|undefined{
        if(this.current - this.lastCurrent === 0){
            return undefined
        }
        let item = this.items[this.lastCurrent];
        delete this.items[this.lastCurrent]
        this.lastCurrent++;
        return item;
    }

    /**
     * 返回第一个元素
     * @return <T> | undefined 返回被第一个元素, 如果没有则返回undefined
     */
    peek():T|undefined{
        if(this.isEmpty()) return undefined
        return this.items[this.lastCurrent]
    }

    /**
     * 返回队列大小
     * @return Number 队列的长度
     */
    size():number{
        return this.current - this.lastCurrent;
    }

    /**
     * 判断是否为空
     * @return Boolean 如果数组为空则返回true, 反之返回false
     */
    isEmpty():boolean{
        return this.size() === 0
    }

    /**
     * 清空队列
     */
    clear(){
        this.lastCurrent = 0;
        this.current = 0;
        this.items = {};
    }

    toString():string{
        const len = this.size();
        if(!len) return "";
        let str = "";
        for (let i = 0; i < len; i++) {
            str += this.items[this.lastCurrent + i];
            str += ","
        }
        str = str.substr(0,str.length-1);
        return str;
    }
}
export default Queue;
// const queue = new Queue(1,2,3)
// console.log("查看长度",queue.size());
// console.log("当前队列元素",queue.toString());
// queue.enqueue(4,5);
// console.log("添加后队列大小",queue.size());
// console.log("添加元素后队列元素",queue.toString());
// console.log("弹出队首元素",queue.dequeue());
// console.log("弹出后队列元素",queue.toString());
// console.log("弹出后队列大小",queue.size());
// console.log("清空队列前查看是否为空",queue.isEmpty());
// console.log("清空队列");
// queue.clear();
// console.log("清空队列后查看是否为空",queue.isEmpty());
// console.log("清空后队列大小",queue.size());
